package myLinkList0517;


class Node<E>{
    E e;//存储数据
    Node<E> next;

    public Node(E e){
        this.e = e;
    }

}

public class MyLinkList<E>{

    Node<E> head;
    Node<E> last;
    int size;

    public void addHead(E e){
        Node<E> node = new Node<>(e);
        if (head == null){
            head = node;
            last = head;
            size++;
        }else {
            node.next = head;
            head = node;
            size++;
        }
    }

    public void addLast(E e){
        Node<E> node = new Node<>(e);
        if (head == null){
            head = node;
            last = head;
            size++;
        }else {
            last.next = node;

            last = last.next;
            size++;
        }
    }

    public void add(E e){
        addLast(e);
    }

    public void remove(E e){
        Node<E> temp=head;
        Node<E> tempLeft=head;


        while(temp!=last){
            if(temp.e.equals(e)){
                if(temp==tempLeft){
                    head=temp.next;
                    temp=head;
                    tempLeft=head;
                }else{
                    tempLeft.next=temp.next;
                    temp=tempLeft.next;
                }

                size--;

            }else{
                tempLeft=temp;
                temp=temp.next;
            }

        }
        if(temp.e.equals(e)){
            last=tempLeft;
            tempLeft.next=null;
        }


//        while (!temp.e.equals(e)){
//            temp = temp.next;
//        }
//        if(temp.e.equals(e)){
//
//        }
//        temp = head;
//        while (temp.next != null){
//            if (temp.next.e.equals(e)){
//                temp.next = temp.next.next;
//                size--;
//            }
//            temp = temp.next;
//        }

    }

    public void remove(int index){
        Node<E> temp ;
        if (index > size){
            System.out.println("输入下标越界");
            return;
        }else {
            temp = head;
            for (int i = 0; i < index - 1; i++) {
                temp = temp.next;
            }
            temp.next = temp.next.next;
            size--;
        }
    }

    public E get(int index){
        if (index > size) {
            System.out.println("输入下标越界");
            return null;
        }
        Node<E> node = head;
        for (int i = 0; i < index ; i++) {
            node = node.next;
        }
//        return node(index).e;
        return node.e;
    }
//    Node<E> node(int index) {
//        // assert isElementIndex(index);
//        Node<E> x = head;
//        for (int i = 0; i < index; i++)
//            x = x.next;
//        return x;
//    }

    public void set(E e,E ne){//在第一个e后面插入ne
        if (head.e.equals(e)){
            Node<E> temp = new Node<>(ne);
            temp.next = head.next;
            head.next = temp;
            size++;
            return;
        }
        Node<E> temp = head;
        Node<E> newnode = new Node<>(ne);
        while (temp.next != null){
            if (temp.next.e.equals(e)){
                temp = temp.next;
                newnode.next = temp.next;
                temp.next = newnode;
                size++;
                break;
            }
            temp = temp.next;
        }
    }

    public void set(int index,E ne){
        if (index > size) {
            System.out.println("输入下标越界");
            return;
        }
        Node<E> temp = head;
        for (int i = 0; i < index - 1; i++) {
            temp = temp.next;
        }
        Node<E> tempn = new Node<>(ne);
        tempn.next = temp.next;
        temp.next = tempn;
        size++;
    }

    public void replace(E oe,E ne){
        Node<E> tenp = head;
        while (tenp.next != null){
            if (tenp.e.equals(oe)){
                tenp.e = ne;
            }
            tenp = tenp.next;
        }
    }

    public static void main(String[] args) {
        MyLinkList<String> list = new MyLinkList<>();
        for (int i = 0; i < 10; i++) {
            list.add("hello" + i);
        }
        list.addHead("Head");
        for (int i = 0; i < list.size; i++) {
            System.out.println(list.get(i));
        }
        System.out.println("______________________________1");
        String temp = list.get(3);
        String temp1 = list.get(8);
        String new1 = "hello3.5";
        String new2 = "hello4.5";
        String new3 = "hello world";
        list.set(temp,new1);
        list.set(4,new2);
        list.remove(list.get(10));
        list.remove(5);
        for (int i = 0; i < list.size; i++) {
            System.out.println(list.get(i));
        }
        System.out.println("______________________________2");
        list.replace("head",new3);
        for (int i = 0; i < list.size ; i++) {
            System.out.println(list.get(i));
        }


    }
}












